﻿
namespace TwinHead.Frameworks.Morph
{
    /// <summary>
    /// 한글 1글자에 대한 자소를 표현합니다.
    /// </summary>
    public sealed class HangulJaso : IHangulJaso 
    {
        private char originalHangul = '\0';
        private char cho = '\0';
        private char jung = '\0';
        private char jong = '\0';

        /// <summary>
        /// 기본생성자 입니다.
        /// </summary>
        public HangulJaso()
        {
        }

        /// <summary>
        /// 지정한 한글 1문자를 자소단위로 분해하여 객체를 채웁니다.
        /// </summary>
        /// <param name="uniChar">분해 대상이되는 한글 1문자</param>
        public HangulJaso( char uniChar )
        {
            if (uniChar == '\0') return;
            this.originalHangul = uniChar;
            Koreans.GetSplitHangul( uniChar, ref this.cho, ref this.jung, ref this.jong );
        }

        /// <summary>
        /// 지정한 자소들을 이용하여 객체를 채웁니다.
        /// </summary>
        /// <param name="cho">한글 초성</param>
        /// <param name="jung">한글 중성</param>
        /// <param name="jong">한글 종성</param>
        public HangulJaso( char cho, char jung, char jong )
        {
            this.cho = cho;
            this.jung = jung;
            this.jong = jong;

            string s = Koreans.AssembleHangul( this.cho, this.jung, this.jong );
            if (string.IsNullOrEmpty( s ))
                originalHangul = '\0';
            else
                originalHangul = s[0];
        }

        #region IHangulJaso 멤버
        /// <summary>
        /// 완전한 한글 1문자를 가져오거나 설정합니다.
        /// <para>값을 설정하게 되면, 자동으로 자소를 분해합니다.</para>
        /// </summary>
        public char OriginalHangul
        {
            get { return originalHangul; }
            set
            {
                if (value == '\0') return;

                originalHangul = value;
                Koreans.GetSplitHangul( originalHangul, ref this.cho, ref this.jung, ref this.jong );
            }
        }
        /// <summary>
        /// 초성문자를 가져오거나 설정합니다.
        /// </summary>
        public char ChoSung
        {
            get { return cho; }
            set { cho = value; }
        }

        /// <summary>
        /// 중성문자를 가져오거나 설정합니다.
        /// </summary>
        public char JungSung
        {
            get { return jung; }
            set { jung = value; }
        }

        /// <summary>
        /// 종성문자를 가져오거나 설정합니다.
        /// </summary>
        public char JongSung
        {
            get { return jong; }
            set { jong = value; }
        }

        #endregion
    }
}
